gtktreeview: Ensure to transiently prelight on touch input
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 24 Apr 2020 21:14:51 +0000 (23:14 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 24 Apr 2020 21:14:51 +0000 (23:14 +0200)
Some machinery (like clicking on expander) relies on prelight state
being up to date, but we don't set prelight on touch events. Do that
transiently, as long as a row is clicked.

Fixes tapping on expanders.

gtk/gtktreeview.c

index 30f97c408ecc06ccfd16d7b0691b1d6ad944a7c6..d7be0c9ac6a6a5544dd249636eec71e7257ce12d 100644 (file)
@@ -832,6 +832,7 @@ static void     column_sizing_notify                         (GObject
                                                               GParamSpec         *pspec,
                                                               gpointer            data);
 static void     gtk_tree_view_stop_rubber_band               (GtkTreeView        *tree_view);
+static void     ensure_unprelighted                          (GtkTreeView        *tree_view);
 static void     update_prelight                              (GtkTreeView        *tree_view,
                                                               int                 x,
                                                               int                 y);
@@ -2788,6 +2789,7 @@ gtk_tree_view_click_gesture_pressed (GtkGestureClick *gesture,
 
   gtk_tree_view_stop_editing (tree_view, FALSE);
   button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
+  sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
 
   if (button > 3)
     {
@@ -2813,6 +2815,9 @@ gtk_tree_view_click_gesture_pressed (GtkGestureClick *gesture,
       return;
     }
 
+  if (sequence)
+    update_prelight (tree_view, x, y);
+
   /* are we in an arrow? */
   if (tree_view->prelight_node &&
       tree_view->arrow_prelit &&
@@ -2913,7 +2918,6 @@ gtk_tree_view_click_gesture_pressed (GtkGestureClick *gesture,
 
   _gtk_tree_view_set_focus_column (tree_view, column);
 
-  sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
   event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence);
   modifiers = gdk_event_get_modifier_state (event);
 
@@ -3270,10 +3274,12 @@ gtk_tree_view_click_gesture_released (GtkGestureClick *gesture,
                                       gdouble          y,
                                       GtkTreeView     *tree_view)
 {
+  GdkEventSequence *sequence;
   gboolean modify, extend;
   guint button;
 
   button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
+  sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
 
   if (button != GDK_BUTTON_PRIMARY ||
       tree_view->button_pressed_node == NULL ||
@@ -3312,6 +3318,9 @@ gtk_tree_view_click_gesture_released (GtkGestureClick *gesture,
 
   tree_view->button_pressed_tree = NULL;
   tree_view->button_pressed_node = NULL;
+
+  if (sequence)
+    ensure_unprelighted (tree_view);
 }
 
 /* GtkWidget::motion_event function set.